﻿/* 战斗回路整合脚本(UTF-8 with BOM),可以一键下上A,下前A,食人花的砸人,食人花吞人,连发拳,切换静音,老板键,模拟器暂停

  By setycyas @2022-11-01
*/

/* 全局设定 
*/ { ;不缩进块
#NoEnv
#Warn
SendMode Input
SetWorkingDir %A_ScriptDir%
} ;不缩进块

/* 调用自制的按键相关函数 
*/ { ;不缩进块
#Include ..\MyAhkModules\MyKey.ahk ;按键相关库,所有函数导出到MyKey对象中
} ;不缩进块

/* 全局变量 
*/ { ;不缩进块

;常量,CT = const,以CT开头的
CTplantSkillDelay := 150 ;植物技能的延时
CTpunchKey := "s" ;拳按键

;枚举量,EN = enum,以EN开头 
ENfaceRight := 0 ;面向右
ENfaceLeft := 1 ;面向左

;接收Gui输入的全局变量,以G=gui 开头
GduRadio := 1 ;技能类型的Radio,du为下上拳
GdfRadio := 0 ;技能类型的Radio,df为下前拳
Gtitle := "" ;接收游戏平台选择

} ;不缩进块

/* 技能操作函数
*/ { ;不缩进块
  
;↓↑A技能,按住skillKey键可以出招后继续连打
duSkill(skillKey){
  global

  MyKey.press.Call("down", 50)
  MyKey.pressKeys.Call(["up", CTpunchKey], [20], 50)
  loop, 100 {
    if (!GetKeyState(skillKey))
      break
    MyKey.press.Call(CTpunchKey, 50)
    sleep, 100
  }
  return
}

;↓→a或↓←a技能,参数face为枚举量ENfaceRight,ENfaceLeft之一
dfSkill(face){
  global 

  local direction := "left"
  if (face != ENfaceLeft) {
    direction := "right"
  }
  MyKey.inputSkill.Call(["down", direction, CTpunchKey], [50, 30, 30])
}

;植物左右连打技能, skillKey是触发技能的按键,因为要检查按键是否松开所以需要这个参数
plantSkill(skillKey){
  global MyKey
  global CTpunchKey
  global CTplantSkillDelay
  directions := ["left", "right"]
  isPressingRight := GetKeyState("right")
  isPressingLeft := GetKeyState("left")
  directionIndex := isPressingRight ? 1 : 2
  ;如果左右键都没有按,默认加按一下右键,否则只按拳
  if (!isPressingRight and !isPressingLeft)
    MyKey.pressKeys.Call(["right", CTpunchKey], [50], CTplantSkillDelay)
  else
    MyKey.press.Call(CTpunchKey, CTplantSkillDelay)
  loop, 10 {
    MyKey.press.Call(directions[directionIndex], CTplantSkillDelay)
    if (!GetKeyState(skillKey))
      break
    directionIndex := (directionIndex == 1) ? 2 : 1
  }
}

;植物吞人技能,face是枚举量ENfaceLeft,ENfaceRight之一
swallow(face){
  global 
  
  local direction1 := "right"
  local direction2 := "left"
  if (face != ENfaceRight) {
    direction1 := "left"
    direction2 := "right"
  }
  local keys := ["down", direction1, "up", CTpunchKey, direction2] 
  local delays := [50, 50, 50, 50, 30]
  MyKey.inputSkill.Call(keys, delays)
}

} ;不缩进块

/* 设置UI的函数
*/ { ;不缩进块
;选择平台UI
selectionUI(){
  Gui, New, , 选择游戏平台
  Gui, add, ListBox, vGtitle, WinKawaks.exe|X-Zone.exe
  GuiControl, Choose, Gtitle, 1 
  Gui, add, Button, gButtonTitleSelect, 选择游戏平台
  Gui, show
  ;ControlGet, ov, Hwnd, , , ahk_class AutoHotkeyGUI
  ;MsgBox, %ov%
  
}  

;设置游戏的主要UI
setupUI(title){
  global
  
  Gui, New, , %title% - batcir
  Gui, Add, Tab3,w230, q-key skill selection|hotkeys ;顺便测试标签页分组,下面直接加入的组件属于当前标签页
  Gui, Tab, 1 ;表示以下组件属于第1个标签页,可省略
  Gui, Add, Radio, Checked vGduRadio, du+a ;技能↓↑A
  Gui, Add, Radio, vGdfRadio, dr+a ;技能↓→a
  Gui, Tab, 2 ;表示以下组件属于第2个标签页
  Gui, Add, Text, ,q - selection skill
  Gui, Add, Text, ,r - plant right left repeat
  Gui, Add, Text, ,2 - down left+a
  Gui, Add, Text, ,3 - down right+a
  Gui, Add, Text, ,a or d - plant swallow skill
  Gui, Tab ;表示下面组件不再属于标签页
  Gui, Add, Button, gButtonSubmit_, Submit_ ;提交
  Gui, Add, Button, gButtonExit, Exit ;结束app
  Gui, +AlwaysOnTop
  Gui, Show, w250h230
}
} ;不缩进块

/* Gui响应函数
*/ { ;不缩进块
ButtonSubmit_(){ 
  Gui, Submit, NoHide ; 保存用户输入后每个控件的数据,NoHide可以在提交数据后保持窗体显示
  MsgBox, You have submit your changes!
}

ButtonExit(){
  ExitApp
}
GuiClose(){
  ExitApp
}

;选择游戏平台
ButtonTitleSelect(){
  global
  
  Gui, Submit, Hide
  setupUI(Gtitle)
  setupHotkeys(Gtitle)
}

} ;不缩进块

/* 快捷键响应函数
*/ { ;不缩进块
;连发拳,为防止死循环,有最大次数限制,放开键则停止:
KeyW(){
  global
  
  loop, 50 {
    MyKey.press.Call(CTpunchKey, 50)
    if (!GetKeyState("w")) {
      break
    }
    sleep, 50
  }
}  
  
;r键,食人花的左右连砸,可以带方向键,松手或砸的次数足够则结束
KeyR(){
  global
  
  plantSkill("r")
}

;q键,↓↑a必杀,不松手是出招后连续按a;或↓→a必杀,在gui选择技能.
KeyQ(){
  global
  
  if (GduRadio) {
    duSkill("q")
  }else if (GdfRadio) {
    dfSkill(ENfaceRight)
  }
}

;2键,↓←a
Key2(){
  global
  
  dfSkill(ENfaceLeft)
}

;3键,↓→a
Key3(){
  global
  
  dfSkill(ENfaceRight)
}

;食人花的技能,测试可行,不过在模拟器中用宏也可以,关键是最后先拳再方向,这样不会转向
KeyA(){
  global
  
  swallow(ENfaceRight)
}
KeyD(){
  global
  
  swallow(ENfaceLeft)
}

;游聚平台的老板键
bossKey(){
  send {Alt down}{Q down}
  sleep, 100
  send {Alt up}{Q up}
}

;切换静音
muteToggle(){
  SoundSet, +1, , Mute
}

;Winkawaks暂停
winkawaksPause(){
  send {Enter down}
  sleep, 100
  send {Enter up}
}

} ;不缩进块

/* 根据游戏平台设置快捷键的函数 
*/ { ;不缩进块
setupHotkeys(title){
  global
  
  local exeTitle := "ahk_exe " . title
  if (exeTitle == "ahk_exe WinKawaks.exe") { ;模拟器WinKawaks
    Hotkey, IfWinActive, %exeTitle%
    Hotkey, ~q, KeyQ
    HotKey, ~r, KeyR
    HotKey, ~2, Key2
    HotKey, ~3, Key3
    HotKey, ~Numpad0, winkawaksPause
    HotKey, ~Numpad1, muteToggle
    Hotkey, IfWinActive
  } else if (exeTitle == "ahk_exe X-Zone.exe") { ;游聚平台
    Hotkey, IfWinActive, %exeTitle%
    Hotkey, ~q, KeyQ
    HotKey, ~r, KeyR
    HotKey, ~2, Key2
    HotKey, ~3, Key3
    HotKey, ~Numpad0, bossKey
    HotKey, ~Numpad1, muteToggle
    HotKey, ~w, KeyW ;增加连发键
    HotKey, ~a, KeyA
    HotKey, ~d, KeyD
    Hotkey, IfWinActive
  }
}
} ;不缩进块

/* 主函数,这里是只显示选择平台的UI,之后交给选择后的函数去处理
*/ { ;不缩进块
main(){
  global
  
  selectionUI()
}
} ;不缩进块

/* 运行脚本 
*/
main()
return
